#pragma once
// Listensockfd封装 --> 专门获取链接的模块
#include <iostream>
#include <memory>

#include "Socket.hpp"
#include "Log.hpp"
#include "InetAddr.hpp"

using namespace SocketMudule;
using namespace LogMudule;
class Listener 
{
public:
    Listener(int port)
    : _listensock(std::make_unique<TcpSocket>())
    , _port(port)
    {
        _listensock->BuildTcpSocketMethod(_port);
    }
    ~Listener()
    {
        _listensock->Close();
    }

    // 获取新链接
    void Accept()
    {
        // 读事件
        // IO处理 -- 获取新连接
        // 你怎么知道，一次来的，就是一个连接呢？如何保证一次读完？
        while(true)
        {
            InetAddr peer;
            int aerrno = 0;
            int sockfd = _listensock->Accepter(&peer, &aerrno);
            if(sockfd < 0)
            {
                auto conn = Factory::BuildConnection(sockfd, EPOLLIN | EPOLLET, nullptr, nullptr, nullptr, nullptr);
            }
            else
            {
                if(aerrno == EAGAIN || aerrno == EWOULDBLOCK)
                {
                    LOG(LogLevel::INFO) << "Accepter wait...";
                    break;
                }

                break;
            }
        }
    }

    int Sockfd()
    {return _listensock->fd();}
    

private:
    std::unique_ptr<Socket> _listensock;
    int _port;
};